\chapter{Architektur}
\label{cha:konzept_architektur}
Als Basis für die detaillierte Konzeption der XCommander Library und der XCommander Erweiterung wird in diesem Kapitel die allgemeine Architektur der Erweiterung definiert. 

\section{Allgemeines}
\label{sec:konzept_allgemeines}

\subsection{Ausgangslage}
\label{subsec:konzept_ausgangslage}
Als potentielle Browser für die Prototyp-Entwicklung wurden Google Chrome, Safari und Opera evaluiert. Alle drei Browser basieren auf einem ähnlichen Erweiterungskonzept. Dieses Konzept gilt als Grundlage für die Architektur der XCommander Library.

\subsection{Technologien}
\label{subsec:konzept_technologien}
Aufgrund der technologischen Randbedingungen der einzelnen Entwicklungskonzepte wird die Erweiterung ausschliesslich in JavaScript entwickelt. Sämtliche Benutzerschnittstellen der Erweiterung werden mittels \acrshort{html} und \acrshort{css} erstellt. Statische Ressourcen werden als Objekte im \acrshort{json}"=Datenformat (\acrlong{json}) gespeichert.

Aufgrund der unterschiedlichen Dateiformate der Manifest"=Dateien (json, plist, xml) und der Erweiterungs"=Bundle (crx, safariextz, ocx), müssen diese beiden Aspekte beim Build und Deployment der Erweiterung für jeden Browser separat behandelt werden.

\section{Begrifflichkeiten}
\label{sec:konzept_begrifflichkeiten}
In Büchern wird im Zusammenhang mit der Programmiersprache JavaScript vielfach der Begriff ">Klasse"< verwendet. Diese Bezeichnung ist jedoch nicht ganz zutreffend. Der Begriff ">Klasse"< wurde stark durch streng typisierte Programmiersprachen wie C++ und Java geprägt. Bei diesen Sprachen repräsentieren Klassen eine Art Vorlage um Objekte danach zu erzeugen.

Aufgrund des Objektmodells von JavaScript spricht man dennoch von Klassen. Im Gegensatz zu C++ und Java sind in JavaScript auch Funktionen Objekte. Da jedes Objekt in JavaScript eine Konstruktorfunktion besitzt und die Konstruktorfunktion selber ein Objekt ist, kann dieses Objekt wiederum Eigenschaften und Funktionen enthalten. Dieses Objektmodell erlaubt eine Klassenbildung, die andern objektorientierten Programmiersprachen gleicht. Im Unterschied zu anderen Programmiersprachen ist JavaScript keine typisierte Programmiersprache und Objekte können während der Laufzeit um Eigenschaften und Methoden erweitert werden. Daher sind Klassen in JavaScript sogenannte ">Objekt Konstruktoren"<.

Aufgrund der Verständlichkeit wird wie in vielen Büchern in dieser Bachelorthesis der Begriff ">Klasse"< anstatt ">Objekt Konstruktor"< verwendet.

\section{Erweiterungskonzept}
\label{sec:konzept_erweiterungskonzept}
Das Erweiterungskonzept der drei evaluierten Browser basiert auf dem Architekturansatz, dass genau eine Background Page während dem gesamten Lebenszyklus der Erweiterung im im Hintergrund des Erweiterungsprozesses ausgeführt wird. Sämtliche Content Scripts der Erweiterung haben Zugriff auf das Document Obejct Model der geladenen Website und können über Messaging"=Verfahren mit dem Background"=Prozess kommunizieren.

\begin{figure}[H]
   \centering
   \includegraphics[width=0.7\textwidth]{images/generic_architecture}
   \caption[Generisches Erweiterungskonzept]{Übersicht über das generische Erweiterungskonzept}
   \label{fig:generic_architecture}
\end{figure}

\autoref{fig:generic_architecture} greift das Erweiterungskonzept der drei evaluierten Browsern in einem generischen Kontext auf (\vgl{\autoref{fig:chrome_architecture}, \autoref{fig:safari_architecture}, \autoref{fig:opera_architecture})).

\section{Abstraktion}
\label{sec:konzept_abstraktion}
Gemäss den Qualitätsanforderungen \refqrequirement{qrq:erweiterbarkeit} muss die Erweiterung hinsichtlich weiterer Browser erweiterbar sein. Um die Abstraktion von browserspezifischen und browserunabhängigen Funktionen gewährleisten zu können, wird die Erweiterung gemäss der Qualitätsanforderung \refqrequirement{qrq:modularisierung} in zwei Module aufgeteilt:

\begin{itemize}
  \item{\textbf{XCommander Library}}
  \begin{compactitem}
    \item{Generischer Messaging Server/Client}
    \item{Kapselt browserspezifische Funktionen}
    \item{Laden von internen und externen Ressourcen via XmlHttpRequest}
    \item{Zugriff auf den Local Storage des Browsers}
    \item{Internationalisierung}
  \end{compactitem}
  \item{\textbf{XCommander Erweiterung}}
    \begin{compactitem}
      \item{\acrshort{ui}}
      \item{Einstellungen}
      \item{\gls{parser}}
    \end{compactitem}
\end{itemize}

Die XCommander Library implementiert das Erweiterungskonzept der einzelnen Browsern und kapselt browserspezifische Funktionen. Die XCommander Erweiterung kann über generische Schnittstellen der XCommander Library auf diese Funktionen zugreifen. 

Durch die Trennung von Library und der eigentlichen Erweiterung kann gewährleistet werden, dass die XCommander Erweiterung nur die Schnittstelle der Library kennen muss und nicht die proprietären Implementationen der jeweiligen Browsern. Diese Abstraktion erleichtert auch die Erweiterbarkeit der gesamten Erweiterung, da die Kompatibilität neuer Browser nur durch die Library gewährleistet werden muss und nicht durch die eigentliche Erweiterung. Die Abstraktion in Library und Erweiterung bietet zu dem den Vorteil, dass die XCommander Library komplett entkoppelt von den funktionalen Anforderungen der XCommander Erweiterung ist und die Library in Zukunft auch für andere browserunabhängige Erweiterungen verwendet werden kann.

\label{sec:konzept_allgmeine_uebersichi}
\autoref{fig:konzept_xcommander_erweiterung_uebericht} greift das generische Erweiterungskonzept aus \autoref{sec:konzept_erweiterungskonzept} auf und zeigt die Module XCommander Library und XCommander Erweiterung und ihre Hauptkomponenten.

\begin{figure}[H]
   \centering
   \includegraphics[width=0.8\textwidth]{images/generic_overview}
   \caption{Allgemeine Übersicht über die XCommander Erweiterung}
   \label{fig:konzept_xcommander_erweiterung_uebericht}
\end{figure}

Die Übersicht in \autoref{fig:konzept_xcommander_erweiterung_uebericht} zeigt, dass sich die Module XCommander Library und XCommander Erweiterung jeweils in eine Komponente im Extension Process und in eine Komponente im Content Process aufteilen lässt. Die Komponenten der XCommander Erweiterung können nur über die XCommander Library im jeweiligen Prozess miteinander kommunizieren.